<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>原型链</title>
</head>
<body>

<script>

function M(name) {
  this.name = name
}

M.prototype.say = function () {
  console.log(`say ${this.name}`)
}

var o3 = new M('o3')

/*
* 模拟new运算符过程
* func: 指定构造函数
* */
var new2 = function (func, argumets) {
  console.log(argumets)
  // 1.生成一个新空对象，该对象要指定构造函数原型对象；也就是o继承构造函数的原型对象；
  var o = Object.create(func.prototype)
  // 2.执行构造函数, 把上下文this指向o对象
  var k = func.call(o, argumets)
  // 3.判断构造函数执行结果是不是对象类型
  if (typeof k === 'object') {
    return k
  } else {
    return o
  }
}
var o4 = new2(M, 'my name is zwj')
console.log(o4.__proto__ === M.prototype) // true
console.log(o4 instanceof M) // true
console.log(o4.__proto__.constructor === M) // true


</script>

</body>
</html>
